/*
 * Building.h
 *
 *  Created on: 22/04/2012
 *      Author: alex
 */

#ifndef BUILDING_H_
#define BUILDING_H_

#include <time.h>
#include <vector>
#include <list>
#include <algorithm>
#include "ApplicationCommon.h"
#include "Floor.h"
#include "FloorProxy.h"
#include "ElevatorProxy.h"
#include "Elevator.h"
#include "../logger/logger.h"
#include "../common/StringUtils.h"

/**
 * Implementa un edificio, el cual contiene N pisos y un ascensor con velocidad V y capacidad máxima C
 *
 */
class Building: public Object
{
public:
    typedef std::vector<Floor *>FloorVector;

    /**
     *
    */
    static const int INITIAL_ELEVATOR_FLOOR = 0;


private:
    FloorProxy m_floors;
    ElevatorProxy m_elevators;

    bool m_doRun;
    bool m_elevatorCalled;

    int m_SimulationDuration;
    time_t m_SimulationStart;

    std::string m_keyGenerationPath;
public:
    /**
     * Construct
     * @param floorAmmount numero de pisos del edificio
     * @param fileName nombre base que se va a usar para generar
     * 		  los archivos de comunicacion entre procesos.
     */
	Building(int floorAmmount, float elevatorSpeed, float elevatorMaxCapacity,
			int elevatorsAmmount, std::string fileName, std::string keyGenerationPath);

	/**
	 * Destructor
	 */
    virtual ~Building();

    /**
     * Comienza el de simulacion del edificio.
     */
	void startSimulation(int simulationDuration);

	/**
	 * Termina el de simulacion del edificio.
	 */
	void stopSimulation();

	void distributeElevatorCalls(FloorIdentifierList callingFloors);

	ElevatorIdentifier getElevatorForCall(FloorIdentifier floor);
};

#endif /* BUILDING_H_ */
